<?php
/**
 *  全局数据字典的调用
 *  
 *  提供配置缓存的类型
 *  
 *  @author  wangzhoudong  <admin@zhen.pl>
 *  @version    1.0
 *
 */
class DictionaryExt extends CApplicationComponent {

	private $cacheName = 'table_filecache_dictionary_option_all';
    private $mmCache  = 'table_memcache_dictionary_option_all';
	
	private $dict;
	
	public function __construct() {
		
	}
    /**
	 * 取得数据字典对应数据
	 *
	 * @author wangzhoudong
	 * @param string $table_code 数据字典的类型
	 * @param string $code 数据字典代码
	 * @param string $val 数据字典数据对应下标
	 * @return array  返回数据字典数组
	 * @throws CException  $table_code,$code 不能为空
	 *
	 */
	
	public function get($table_code,$code,$val=null) {
		$mKey = Yii::app()->memcache->get($this->cacheName);
		if(isset($mKey[$table_code][$code])) {
			$arr =  $mKey[$table_code][$code];
		}else{
			$this->updateMemCache($table_code,$code);
			$arr =  $this->dict[$table_code][$code];
		}
		if(isset($val)) {
			if(array_key_exists($val, $arr)) {         
				return $arr[$val];
			}else{
				return '';
			}
		}else{		  
			return $arr;
		}
	}
    /**
	 * 
 	 * @param string $table_code 数据字典的类型
	 * @param string $code 数据字典代码
	 * @param string $selection 被选中的值。
	 * @param array $htmlOptions  额外的HTML属性。如name='cate' ,id='cate'下面两个特定的属性是被认可： 
	 * 						      empty: 字符串，指定空选项的文本，它的值为空。
	 * 							       'empty'选项也可以是一个值-标签对形式的数组。
	 * 							                  在一开始每个对都会用于渲染一个列表的选项。注意，
	 *  							       文本标签不会被HTML编码。 
     *
	 * 
	 */
	public function select($table_code,$code,$selection=null,$htmlOptions=array()) {
		$data = $this->get($table_code,$code);
		$selectOption = $htmlOptions;
		unset($selectOption['empty']);
       
		$html = "<select ";
		foreach($selectOption as $key=>$val) {
			$html .= " $key='$val'";
		}
		$html .= ' >';
		if (isset ( $htmlOptions ['empty'] )) {
			$value = "";
			$label = $htmlOptions ['empty'];
			if (is_array ( $label )) {
				$value = array_keys ( $label );
				$value = $value [0];
				$label = array_values ( $label );
				$label = $label [0];
			}
			$html .= '<option value="' . $value . '">' . ($label) . "</option>\n";
		}
		foreach ($data as $k=>$v) {
			$html .= "<option value='$k'";
			if($k==$selection) {
				$html .= " selected";
			}
			$html .= ">$v</option>";
		}
		
		$html .= "</select>";
		return $html;
	}
	/**
	 * 更新对应数据字典，如参数都为空全部更新
	 * 
	 * @author wangzhoudong
	 * @param string $table_code 需要更新的类型
	 * @param string $code 需要更新的代码
	 * @return bool  返回成功失败
	 * @throws CException
	 * 
	 */
	public function updateFileCache($table_name=null,$code=null) {

		$criteria =new CDbCriteria();
		if($table_name){
		    $criteria->addCondition('table_name="'.$table_name.'"');
		}
		if($code){
		    $criteria->addCondition('code="'.$code.'"');
		}
		$criteria->with='dict';
		$criteria->order='t.sort desc';
		$oData = BaseDictionaryModel::model()->findAll();
		$dict = array();
		foreach($oData as $v) {
			$option=$v->dict;
			if(isset($option)){
				foreach ($option as $n=>$m){
					$dict[$v->table_name][$v->code][$m->value] = $m->option_name;
				}
			}
		}
		Yii::app()->filecache->set($this->cacheName,$dict);
		return $dict;
	}
    public function updateMemCache($table_name=null,$code=null) {
		
		$criteria =new CDbCriteria();
		if($table_name){
		    $criteria->addCondition('table_name="'.$table_name.'"');
		}
		if($code){
		    $criteria->addCondition('code="'.$code.'"');
		}
		$criteria->with='dict';
		$criteria->order='t.sort desc';
		$oData = BaseDictionaryModel::model()->findAll();
		$dict = array();
		foreach($oData as $v) {
			$option=$v->dict;
			if(isset($option)){
				foreach ($option as $n=>$m){
					$dict[$v->table_name][$v->code][$m->value] = $m->option_name;
				}
			}
		}
		$this->dict = $dict;
		Yii::app()->memcache->set($this->mmCache,$this->dict);
		return true;	
	}
	
}

?>